package com.eliza.base.entity.di

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import com.eliza.base.entity.model.user.UserDao
import com.eliza.library.data.entity.UserEntity
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton

// 声明数据库
@Database(
    entities = [
        UserEntity::class,
    ],
    version = 1,
    exportSchema = false,
)

abstract class GroupDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}
//

//Hilt 模块是带有@Module 和 @InstallIn 注解的类。
//@Module 会告知 Hilt 这是一个模块，而 @InstallIn 会通过指定 Hilt 组件告知 Hilt 绑定在哪些容器中可用
@Module
@InstallIn(SingletonComponent::class)
object DatabaseModule {
    @Provides // @Provides 注解，告知 Hilt 如何提供无法通过构造函数注入的类型
    @Singleton //单例模式
    fun provideUserDatabase(
        @ApplicationContext context: Context,
    ): GroupDatabase = Room.databaseBuilder(
        context,
        GroupDatabase::class.java,
        DATABASE_NAME
    )
        // .allowMainThreadQueries() //绕过主线程不可操作数据库
        .fallbackToDestructiveMigration()
        .build()

    // @Provides 注解，告知 Hilt 如何提供无法通过构造函数注入的类型
    @Provides
    @Singleton
    fun providesUserDao(
        database: GroupDatabase,
    ): UserDao = database.userDao()
}


private const val DATABASE_NAME = "exam-db"